﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;

namespace RiskMan.DataClass.Models.Plaza_II.FortsFootCommonRepl
{
    /// <summary>
    /// Таблица 20. Поля таблицы common - Общая информация по сессии
    /// </summary>
    public class Common: INotifyPropertyChanged
    {

        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private int _isinId;
        private int _sessid;
        private Decimal _bestSell;
        private int _amountSell;
        private Decimal _bestBuy;
        private int _amountBuy;
        private Decimal _price;
        private Decimal _trend;
        private int _amount;
        private DateTime _dealTime;
        private Decimal _minPrice;
        private Decimal _maxPrice;
        private Decimal _avrPrice;
        private Decimal _oldKotir;
        private int _dealCount;
        private int _contrCount;
        private Decimal _capital;
        private int _pos;
        private DateTime _modTime;
        private Decimal _curKotir;
        private Decimal _curKotirReal;
        private int _ordersSellQty;
        private int _ordersSellAmount;
        private int _ordersBuyQty;
        private int _ordersBuyAmount;
        private Decimal _openPrice;
        private Decimal _closePrice;
        private DateTime _localTime;

        #endregion

        #region public

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }
        
        /// <summary>
        /// Уникальный числовой идентификатор инструмента
        /// </summary>
        public int IsinId
        {
            get { return _isinId; }
            set
            {
                if (_isinId != value)
                {
                    _isinId = value;
                    RaisePropertyChanged("IsinId");
                }
            }
        }
        
        /// <summary>
        /// Идентификатор торговой сессии
        /// </summary>
        public int Sessid
        {
            get { return _sessid; }
            set
            {
                if (_sessid != value)
                {
                    _sessid = value;
                    RaisePropertyChanged("Sessid");
                }
            }
        }
        
        /// <summary>
        /// Цена лучшей заявки на продажу
        /// </summary>
        public Decimal BestSell
        {
            get { return _bestSell; }
            set
            {
                if (_bestSell != value)
                {
                    _bestSell = value;
                    RaisePropertyChanged("BestSell");
                }
            }
        }
        
        /// <summary>
        /// Количество в заявках на продажу с лучшей ценой
        /// </summary>
        public int AmountSell
        {
            get { return _amountSell; }
            set
            {
                if (_amountSell != value)
                {
                    _amountSell = value;
                    RaisePropertyChanged("AmountSell");
                }
            }
        }
        
        /// <summary>
        /// Цена лучшей заявки на покупку
        /// </summary>
        public Decimal BestBuy
        {
            get { return _bestBuy; }
            set
            {
                if (_bestBuy != value)
                {
                    _bestBuy = value;
                    RaisePropertyChanged("BestBuy");
                }
            }
        }
        
        /// <summary>
        /// Количество в заявках на покупку с лучшей ценой
        /// </summary>
        public int AmountBuy
        {
            get { return _amountBuy; }
            set
            {
                if (_amountBuy != value)
                {
                    _amountBuy = value;
                    RaisePropertyChanged("AmountBuy");
                }
            }
        }
        
        /// <summary>
        /// Цена последней сделки
        /// </summary>
        public Decimal Price
        {
            get { return _price; }
            set
            {
                if (_price != value)
                {
                    _price = value;
                    RaisePropertyChanged("Price");
                }
            }
        }
        
        /// <summary>
        /// Тренд изменения цены (разница между ценами двух последних сделок)
        /// </summary>
        public Decimal Trend
        {
            get { return _trend; }
            set
            {
                if (_trend != value)
                {
                    _trend = value;
                    RaisePropertyChanged("Trend");
                }
            }
        }
        
        /// <summary>
        /// Количество в последней сделке
        /// </summary>
        public int Amount
        {
            get { return _amount; }
            set
            {
                if (_amount != value)
                {
                    _amount = value;
                    RaisePropertyChanged("Amount");
                }
            }
        }
        
        /// <summary>
        /// Дата и время последней сделки
        /// </summary>
        public DateTime DealTime
        {
            get { return _dealTime; }
            set
            {
                if (_dealTime != value)
                {
                    _dealTime = value;
                    RaisePropertyChanged("DealTime");
                }
            }
        }
        
        /// <summary>
        /// Минимальная цена
        /// </summary>
        public Decimal MinPrice
        {
            get { return _minPrice; }
            set
            {
                if (_minPrice != value)
                {
                    _minPrice = value;
                    RaisePropertyChanged("MinPrice");
                }
            }
        }
        
        /// <summary>
        /// Максимальная цена
        /// </summary>
        public Decimal MaxPrice
        {
            get { return _maxPrice; }
            set
            {
                if (_maxPrice != value)
                {
                    _maxPrice = value;
                    RaisePropertyChanged("MaxPrice");
                }
            }
        }
        
        /// <summary>
        /// Средневзвешенная цена
        /// </summary>
        public Decimal AvrPrice
        {
            get { return _avrPrice; }
            set
            {
                if (_avrPrice != value)
                {
                    _avrPrice = value;
                    RaisePropertyChanged("AvrPrice");
                }
            }
        }
        
        /// <summary>
        /// Расчетная цена предыдущей сессии
        /// </summary>
        public Decimal OldKotir
        {
            get { return _oldKotir; }
            set
            {
                if (_oldKotir != value)
                {
                    _oldKotir = value;
                    RaisePropertyChanged("OldKotir");
                }
            }
        }
        
        /// <summary>
        /// Количество сделок
        /// </summary>
        public int DealCount
        {
            get { return _dealCount; }
            set
            {
                if (_dealCount != value)
                {
                    _dealCount = value;
                    RaisePropertyChanged("DealCount");
                }
            }
        }
        
        /// <summary>
        /// Общее количество контрактов в сделках
        /// </summary>
        public int ContrCount
        {
            get { return _contrCount; }
            set
            {
                if (_contrCount != value)
                {
                    _contrCount = value;
                    RaisePropertyChanged("ContrCount");
                }
            }
        }
        
        /// <summary>
        /// Суммарный объём сделок в рублях
        /// </summary>
        public Decimal Capital
        {
            get { return _capital; }
            set
            {
                if (_capital != value)
                {
                    _capital = value;
                    RaisePropertyChanged("Capital");
                }
            }
        }
        
        /// <summary>
        /// Текущее кол-во открытых позиций
        /// </summary>
        public int Pos
        {
            get { return _pos; }
            set
            {
                if (_pos != value)
                {
                    _pos = value;
                    RaisePropertyChanged("Pos");
                }
            }
        }
        
        /// <summary>
        /// Дата и время изменения записи
        /// </summary>
        public DateTime ModTime
        {
            get { return _modTime; }
            set
            {
                if (_modTime != value)
                {
                    _modTime = value;
                    RaisePropertyChanged("ModTime");
                }
            }
        }
        
        /// <summary>
        /// Текущая котировка
        /// </summary>
        public Decimal CurKotir
        {
            get { return _curKotir; }
            set
            {
                if (_curKotir != value)
                {
                    _curKotir = value;
                    RaisePropertyChanged("CurKotir");
                }
            }
        }
        
        /// <summary>
        /// Рыночная котировка
        /// </summary>
        public Decimal CurKotirReal
        {
            get { return _curKotirReal; }
            set
            {
                if (_curKotirReal != value)
                {
                    _curKotirReal = value;
                    RaisePropertyChanged("CurKotirReal");
                }
            }
        }
        
        /// <summary>
        /// Количество заявок на продажу
        /// </summary>
        public int OrdersSellQty
        {
            get { return _ordersSellQty; }
            set
            {
                if (_ordersSellQty != value)
                {
                    _ordersSellQty = value;
                    RaisePropertyChanged("OrdersSellQty");
                }
            }
        }
        
        /// <summary>
        /// Объём в контрактах в заявках на продажу
        /// </summary>
        public int OrdersSellAmount
        {
            get { return _ordersSellAmount; }
            set
            {
                if (_ordersSellAmount != value)
                {
                    _ordersSellAmount = value;
                    RaisePropertyChanged("OrdersSellAmount");
                }
            }
        }
        
        /// <summary>
        /// Количество заявок на покупку
        /// </summary>
        public int OrdersBuyQty
        {
            get { return _ordersBuyQty; }
            set
            {
                if (_ordersBuyQty != value)
                {
                    _ordersBuyQty = value;
                    RaisePropertyChanged("OrdersBuyQty");
                }
            }
        }
        
        /// <summary>
        /// Объём в контрактах в заявках на покупку
        /// </summary>
        public int OrdersBuyAmount
        {
            get { return _ordersBuyAmount; }
            set
            {
                if (_ordersBuyAmount != value)
                {
                    _ordersBuyAmount = value;
                    RaisePropertyChanged("OrdersBuyAmount");
                }
            }
        }
        
        /// <summary>
        /// Цена открытия
        /// Поле open_price содержит цену первой сделки в текущей сессии, а если её нет, то 0
        /// </summary>
        public Decimal OpenPrice
        {
            get { return _openPrice; }
            set
            {
                if (_openPrice != value)
                {
                    _openPrice = value;
                    RaisePropertyChanged("OpenPrice");
                }
            }
        }
        
        /// <summary>
        /// Цена закрытия
        /// Поле close_price содержит цену последней сделки в текущей сессии, а если её нет, то 0
        /// </summary>
        public Decimal ClosePrice
        {
            get { return _closePrice; }
            set
            {
                if (_closePrice != value)
                {
                    _closePrice = value;
                    RaisePropertyChanged("ClosePrice");
                }
            }
        }
        
        /// <summary>
        /// Поле для мониторинга репликации common
        /// </summary>
        public DateTime LocalTime
        {
            get { return _localTime; }
            set
            {
                if (_localTime != value)
                {
                    _localTime = value;
                    RaisePropertyChanged("LocalTime");
                }
            }
        }

        #endregion

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region processing
        public static Common ParseCommon(Dictionary<String, String> relation)
        {
            Common tmp = new Common();
            tmp.Parse(relation);
            return tmp;
        }

        public void Parse(Dictionary<String, String> relation)
        {
            foreach (String field in relation.Keys)
            {
                String value = relation[field];

                switch (field)
                {
                    case "replID": long.TryParse(value, out _replId); break;
                    case "replRev": long.TryParse(value, out _replRev); break;
                    case "replAct": long.TryParse(value, out _replAct); break;
                    case "isin_id": int.TryParse(value, out _isinId); break;
                    case "sessid": int.TryParse(value, out _sessid); break;
                    case "best_sell": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _bestSell); break;
                    case "amount_sell": int.TryParse(value, out _amountSell); break;
                    case "best_buy": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _bestBuy); break;
                    case "amount_buy": int.TryParse(value, out _amountBuy); break;
                    case "price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _price); break;
                    case "trend": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _trend); break;
                    case "amount": int.TryParse(value, out _amount); break;
                    case "deal_time": DateTime.TryParse(value, out _dealTime); break;
                    case "min_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _minPrice); break;
                    case "max_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _maxPrice); break;
                    case "avr_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _avrPrice); break;
                    case "old_kotir": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _oldKotir); break;
                    case "deal_count": int.TryParse(value, out _dealCount); break;
                    case "contr_count": int.TryParse(value, out _contrCount); break;
                    case "capital": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _capital); break;
                    case "pos": int.TryParse(value, out _pos); break;
                    case "mod_time": DateTime.TryParse(value, out _modTime); break;
                    case "cur_kotir": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _curKotir); break;
                    case "cur_kotir_real": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _curKotirReal); break;
                    case "orders_sell_qty": int.TryParse(value, out _ordersSellQty); break;
                    case "orders_sell_amount": int.TryParse(value, out _ordersSellAmount); break;
                    case "orders_buy_qty": int.TryParse(value, out _ordersBuyQty); break;
                    case "orders_buy_amount": int.TryParse(value, out _ordersBuyAmount); break;
                    case "open_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _openPrice); break;
                    case "close_price": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _closePrice); break;
                    case "local_time": DateTime.TryParse(value, out _localTime); break; 

                };
            }
        }

        public static void AddValueToObsColCommon(Common inst)
        {
            MainWindow.StaticLevel._dataProvider.CommonList.Add(inst);
        }
        #endregion
    }
}
